#include<stdio.h>
/*
																fgets函数
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	函数概要:
			fgets 函数用于从指定文件中读取字符串。
			fgets 函数最多可以读取 size - 1 个字符，因为结尾处会自动添加一个字符串结束符 '\0'。
			当读取到换行符（'\n'）或文件结束符（EOF）时，表示结束读取（'\n' 会被作为一个合法的字符读取）。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

	函数原型：
			#include <stdio.h>
			...
			char *fgets(char *s, int size, FILE *stream);

	参数解析：
		参数							含义
		s							字符型指针，指向用于存放读取字符串的位置
		size						指定读取的字符数（包括最后一个自动添加的'\0'）
		stream						该参数是一个FILE对象的指针，指定一个待操作的数据流

	说人话就是：（char *fgets(“容器的地址”， “容器的大小”， “从哪里读取”)）
	目前我们学到的就是从stdin标准输入流读取，也就是键盘缓冲区;


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

	注意事项：
			1.  fgets()函数的最大读取大小是其“第二个参数减1”，
				这是由于字符串是以’\0’为结束符的，fgets()为了保证输入内容的字符串格式，
				当输入的数据大小超过了第二个参数指定的大小的时候，fgets()会仅仅读取前面的“第二个参数减1”个字符，而预留1个字符的空间来存储字符串结束符’\0’

			2.在fgets()函数的眼里，换行符’\n’也是它要读取的一个普通字符而已。
				在读取键盘输入的时候会把最后输入的回车符也存进数组里面，即会把'\n'也存进数组里面，
				而又由于字符串本身会是以’\0’结尾的。所以在输入字符个数没有超过第二个参数指定大小之前，你输入n个字符按下回车输入，
				fgets()存储进第一个参数指定内存地址的是n+2个字节。最后面会多出一个'\n'和一个'\0'，而且'\n'是在'\0'的前面一个（\n\0）。
				至于怎么删除嘛，你可以看看指针与数组章节，我在那里已经写好了

			3.fgets()函数只负责读取，并不会事先清空参数1指向的地址内存。读取到的字节会覆盖原地址储存，但没有覆盖到的内容还是保持原样。

			4.在用fgets()函数读取键盘输入的时候，如果输入多于其“第二个参数减1”个字符大小的数据，fgets()只会读取走前”第二个参数减1”个字符，多余的字符残留在输入缓存区里面。如果不清空，可能会影响下次输入。

			以上提到的我会分别进行代码解释



*/

//程序1
//初步使用fgets函数读取代码

void test1()
{
	char buffer[5];  // 定义一个长度为5的字符数组
	printf("请输入一串字符：");
	fgets(buffer, sizeof(buffer), stdin);
	printf("读取的内容是：%s\n", buffer);

	/*
		
		char buffer[5];：定义了一个长度为 5 的字符数组 buffer，用于存储从标准输入读取的字符串。
		fgets(buffer, sizeof(buffer), stdin);：调用 fgets 函数从标准输入（键盘）读取数据。sizeof(buffer) 计算出 buffer 数组的大小为 5，作为 fgets 的第二个参数。
		fgets 读取规则：fgets 函数会读取输入的字符，但是为了保证读取的内容能以字符串的形式正确存储，它最多只会读取 sizeof(buffer) - 1 个字符，也就是 4 个字符。剩下的一个位置用于存储字符串结束符 '\0'。
		示例运行情况：假如你输入 abcdef，fgets 只会读取前 4 个字符 abcd，并在后面加上 '\0'，最终 buffer 中的内容是 abcd\0。所以程序输出为 读取的内容是：abcd。
	*/
	
}


//程序2
//解析注意事项1：超出长度

void test2()
{
	char buffer[100];
	printf("请输入一串字符：");
	fgets(buffer, sizeof(buffer), stdin);
	for (int i = 0; buffer[i] != '\0'; i++) {
		if (buffer[i] == '\n') {
			printf("找到换行符，位置是 %d\n", i);
		}
	}
	/*
		char buffer[100];：定义一个长度为 100 的字符数组 buffer 用于存储输入的字符串。
		fgets(buffer, sizeof(buffer), stdin);：从标准输入读取字符串到 buffer 中。当你输入字符并按下回车键时，回车键对应的换行符 '\n' 也会被 fgets 当作普通字符读取到 buffer 中。
		for 循环：遍历 buffer 数组，当遇到 '\0' 时停止。在遍历过程中，如果发现某个字符是 '\n'，则输出该换行符的位置。
		示例运行情况：假如你输入 abc 然后按下回车键，buffer 中存储的内容是 abc\n\0。程序会输出 找到换行符，位置是 3。
	
	*/


}

//程序3
//解析注意事项2：意外换行
void test3()
{
	char buffer[100] = "初始内容";
	printf("原始内容：%s\n", buffer);
	printf("请输入一串字符：");
	fgets(buffer, 5, stdin);
	printf("读取后的内容：%s\n", buffer);
	/*
		char buffer[100] = "初始内容";：定义一个长度为 100 的字符数组 buffer，并初始化为 初始内容。
		fgets(buffer, 5, stdin);：从标准输入读取数据到 buffer 中，fgets 最多读取 4 个字符（因为要留一个位置给 '\0'）。
		fgets 读取特性：fgets 不会清空 buffer 原有的内容，它只是将读取到的字符覆盖 buffer 中相应位置的内容。如果读取的字符数量小于 buffer 的大小，那么未被覆盖的部分会保持原样。
		示例运行情况：假如你输入 abcd，fgets 会将 abcd 覆盖 buffer 的前 4 个字符位置，然后加上 '\0'。最终 buffer 中的内容是 abcd\0容，程序输出 读取后的内容：abcd（因为字符串以 '\0' 为结束标志，后面的 容 不会被输出）。
	
	*/

}


//程序4
//解析注意事项3:覆盖原先地址存储
void test4()
{
	char str[10] = "initial";
	fgets(str, 10, stdin);
	printf("You entered: %s\n", str);

	//har buffer[100] = "初始内容";：定义一个长度为 100 的字符数组 buffer，并初始化为 初始内容。
	//fgets(buffer, 5, stdin); ：从标准输入读取数据到 buffer 中，fgets 最多读取 4 个字符（因为要留一个位置给 '\0'）。
	//	fgets 读取特性：fgets 不会清空 buffer 原有的内容，它只是将读取到的字符覆盖 buffer 中相应位置的内容。如果读取的字符数量小于 buffer 的大小，那么未被覆盖的部分会保持原样。
	//	示例运行情况：假如你输入 abcd，fgets 会将 abcd 覆盖 buffer 的前 4 个字符位置，然后加上 '\0'。最终 buffer 中的内容是 abcd\0容，程序输出 读取后的内容：abcd（因为字符串以 '\0' 为结束标志，后面的 容 不会被输出）。
}


//程序5
//分析注意事项4：输入多于 “第二个参数减 1” 个字符时，多余字符残留在输入缓存区

void test5()
{
	char buffer1[5];
	char buffer2[100];
	printf("请输入一串较长的字符：");
	fgets(buffer1, sizeof(buffer1), stdin);
	printf("第一次读取的内容：%s\n", buffer1);
	fgets(buffer2, sizeof(buffer2), stdin);
	printf("第二次读取的内容：%s\n", buffer2);

	/*
		char buffer1[5]; 和 char buffer2[100];：分别定义了长度为 5 和 100 的字符数组 buffer1 和 buffer2。
		fgets(buffer1, sizeof(buffer1), stdin);：从标准输入读取数据到 buffer1 中，由于 buffer1 大小为 5，fgets 最多读取 4 个字符。
		输入缓存区残留问题：如果输入的字符数量超过 4 个，比如输入 abcdefg，fgets 会将前 4 个字符 abcd 读取到 buffer1 中，剩下的字符 efg 会残留在输入缓存区。
		fgets(buffer2, sizeof(buffer2), stdin);：当再次调用 fgets 读取数据到 buffer2 时，它会首先从输入缓存区读取残留的字符 efg，而不需要你再次输入。
		示例运行情况：输入 abcdefg 后，第一次读取的内容是 abcd，第二次读取的内容是 efg（后面可能还会有换行符等）。
	*/

}


//主函数
int main()
{
	test5();
	return 0;
}

